package main

import (
	"StrayAnimals/api"
	"StrayAnimals/internal/initConfig"
	"context"
	"errors"
	"fmt"
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	// 读取配置文件
	appConfig, err := initConfig.InitLoad()
	if err != nil {
		log.Printf("无法读取配置文件: %v\n", err)
		os.Exit(1)
	}

	// 初始化日志
	logger := initConfig.InitLogger(appConfig.Log)
	defer func(logger *zap.Logger) {
		err := logger.Sync()
		if err != nil {
			log.Printf("无法刷新缓冲区: %v\n", err)
			os.Exit(1)
		}
	}(logger)

	// 初始化SQL数据库
	initConfig.InitSqlDB(appConfig.SqlDatabase)

	// 初始化Redis数据库
	initConfig.InitRedisDB(appConfig.RedisDatabase)

	// 初始化CORS
	corsConfig := initConfig.InitCors(appConfig.CORS)

	// 创建 Gin 路由引擎
	r := gin.Default()

	// 使用自定义 CORS 配置
	r.Use(cors.New(corsConfig))

	// 注册路由
	api.SetupRoutes(r)

	// ====使用 http.Server 自定义超时====
	addr := fmt.Sprintf("%s:%d", appConfig.ServerAddress.Host, appConfig.ServerAddress.Port)
	srv := &http.Server{
		Addr:         addr,
		Handler:      r,
		ReadTimeout:  10 * time.Minute, // 读取请求体的最大时间（比如上传文件）
		WriteTimeout: 10 * time.Minute, // 写入响应的最大时间
		IdleTimeout:  10 * time.Minute, // 空闲连接的最大存活时间
	}

	// 启动服务器
	go func() {
		zap.L().Info("服务器正在运行", zap.String("addr", addr))
		if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
			zap.L().Fatal("无法启动服务", zap.Error(err))
		}
	}()

	// 等待中断信号以优雅地关闭服务器（可选）
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	zap.L().Info("正在关闭服务器...")

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		zap.L().Error("服务器强制关闭", zap.Error(err))
	}

	zap.L().Info("服务器已安全关闭")
}
